Skip to content

feat: add stage2 citation accuracy gates - #14

Draft
Qinbf wants to merge 19 commits into
mainfrom
codex/citation-accuracy-v2-p1-evals
Draft

feat: add stage2 citation accuracy gates#14
Qinbf wants to merge 19 commits into
mainfrom
codex/citation-accuracy-v2-p1-evals

Conversation

@Qinbf

@Qinbf Qinbf commented Jul 12, 2026

Copy link
Copy Markdown
Owner

What changed

  • Added Stage 2 answer-to-citation, conversion-fidelity, and external holdout evaluation gates.
  • Added layout-aware PDF conversion for long documents, including tables, columns, headings, and ambiguous-layout rejection.
  • Added conversion receipts and source bindings so modified, deleted, or tampered source material invalidates the evidence index.
  • Added CI, release guards, documentation, and adversarial regression coverage.

Why

Long documents can lose fine-grained evidence during conversion, which makes detailed retrieval and precise citations unreliable. This change preserves evidence structure and fails closed when source fidelity cannot be established.

Impact

  • Ingest retains more long-document detail and provenance.
  • Retrieval rejects stale or unverifiable evidence indexes instead of serving potentially incorrect citations.
  • Public evaluation gates provide reproducible accuracy and regression measurements.

Validation

  • 742 Python tests passed.
  • Stage 2 public gates passed: holdout 744/744, contract mutations 14/14, and conversion-fidelity core metrics at 100%.
  • Web lint/build, debug-console tests, and 22 release guards passed.
  • Independent audit found no P0, P1, or P2 issues.

Accuracy boundary

Public and synthetic gates are green, but this does not claim universal 100% accuracy on every unseen real-world document. The implementation prefers fail-closed rejection over unsupported citations; independent hidden-bundle certification remains a separate external step.

Qinbf and others added 19 commits July 2, 2026 18:13
现有 lint 只保证引用「结构正确」(锚点存在/有引用/粒度够细),全链路无一处
比对「被引块内容 vs 论断内容」——agent 引真实存在但内容不符的锚点时全绿。
本次落地三层防线(KB 只出确定性数据,语义判定由外部 agent 完成,终审在人):

k.py(零 LLM,+~900 行):
- list-cite-mismatches:论断数字/逐字引文须出现在被引块原文(数值按声明精度
  舍入容差;约数放宽;wikilink/markdown 链接/URL 掩码;§节号/arXiv 编号/年份
  排除;[需要来源] 窗口豁免;混合目标任一文件缺失整块降级 unverifiable——
  release 无 raw 环境零误报;^h- 大节命中只降级 imprecise 防草垛)
- extract-claims:确定性枚举(论断块, 块级引用)审计对;pair_id 含 claim hash、
  target 侧对现行内容重算 hash(^h- 对整节正文,补「锚点只 hash 标题」盲区);
  --changed/--commit(git)/--paths/--unaudited-only/--sample+--seed 可复现抽样
- cite-audit-log:验证台账 .cache/citation_audit.jsonl 受控写入(纯派生层,
  删了重审即重建);pair 过期拒绝、可解析目标记 UNVERIFIABLE 拒绝、agent 记
  SUPPORTED 必须附 --evidence 且字面命中被引原文(堵橡皮图章)
- list-suspect-citations [--check-ledger]:CAUTION 审计标注扫描(待办以
  markdown 为真相源)+ 台账↔markdown 对账(堵「删标注蒸发」)
- bare-claims/coarse-citations 图案对称化:数字正则补裸小数/小写k/中文倍数
  (消除「删引用反而隐形」);整页 [[wiki/sources/X]] 引用纳入 coarse(封逃逸)
- health 新增 7 项引用计数;测试 +38(含 demo 库零闸门项守护)

skills 协议(.claude ↔ .agents 逐字镜像):
- kb-ingest:quote-first 硬规则(写数字/引文前必须 read-block 从原文抄写)、
  find-anchor 须核对 preview、新增第 9.5 步 writer/verifier 分离回验
  (fresh-context 子 agent 判定、处置表、封「删引用挂[需要来源]」洗白、
  最多 2 轮复验、citation-verify 对账行)、质量闸门扩两条
- kb-lint 5b:升级为确定性分诊 + 周配额语义审计(seed=周号可复现累积)
- 新增 kb-cite-audit skill:存量审计完整协议(分诊/三问判定/防误伤细则/
  CAUTION 落标注/对账)

CLAUDE.md/AGENTS.md:新增「引用语义审计规范」节([KB 推算] 标记、CAUTION
标注格式、台账定位与真相源分界)、ingest 第 13 步闸门扩充、lint 第 4 步指向
kb-cite-audit。

demo 整备(rag-evolution):lint 首跑抓出 9 处真实问题并修复——错引改锚/
补 raw 表格引用/无支撑引文改转述/无来源数字挂 [需要来源]/强调引号去引;
三库闸门项归零并由 TestCiteCheckDemoGuard 钉住。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
针对引用准确性的四个残余缺口再加四道防线:

k.py:
- extract-claims --cloze:把论断中可核对数字挖成 ⟦N1⟧ 占位(同 token 全部挖掉
  防泄漏、按首现位置编号);cloze-check 按数值容差机器判分——「盲填复核」:
  核验者只看挖空论断+被引原文填空、全程看不到期望值,从原理上消灭判定式
  审核的附和偏差,并抓「数字巧合在场但归属错误」(确定性层已知盲区)
- check-draft:查询答案/导出稿当临时页面过同一套核对机器(数字核对+裸论断+
  引用粒度+审计对枚举),闭掉「查询阶段无机器闸门」缺口;cloze-check --draft 配套
- 数字模式补计量单位形态(42ms/16GB/3000QPS)——两套模式同步,写错延迟/容量
  数字此前任何层都核不到
- 测试 +5(cloze 挖空/判分三路/单位模式/草稿好坏各路)

tools/cite-audit(新,外部客户端——原则 1 的 tools/ 例外区):
- DeepSeek 跨模型二审:盲填+反驳双通道,判定自动入台账;独立执行器(人工/
  定时触发),不依赖写作 agent 协议自觉;换模型消除同源相关盲区
- e2e 实测:阳性 12/12 SUPPORTED;阴性精准拦截「数字全对的张冠李戴」与
  「成本数字翻倍」两类毒块,干净块零误伤
- 盲填按「论断块」分组、多引用 evidence 合并判分(与确定性 lint 的 union
  语义一致——单 pair 判分会对不归它的空误判)

pre-commit hook:
- staged wiki 文件带 cite 闸门项(mismatch/exempt-missing-basis)即拒绝提交,
  范围只限 staged 文件(存量债务不拦无关提交);把 9.5a 从行为规范硬化为
  机器强制;已实测拦截

skills(.claude ↔ .agents 镜像)+ CLAUDE.md/AGENTS.md:
- kb-ingest 9.5b:verifier 改反驳式立场、加盲填通道与跨模型二审步骤
- kb-query 新增第 7.5 步:答案含精确数字/引文时 check-draft 闸门全绿才可发出
- kb-cite-audit:双通道判定协议 + tools/cite-audit 用法
- kb-lint 5b:每周对已 SUPPORTED 台账记录换模型抽查交叉复查
- 「引用语义审计规范」节登记全部四个新机制

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
四个上限升级(按用户取舍:跳过专用小模型;构造即正确暂缓):

1. 原子论断分解:cite 核对与审计对枚举改「核对单元」粒度——list 块按条目拆,
   每条目对自己的引用负责(无引用回退整块并集)。上线首跑即在 demo 库抓出
   块级 union 不可见的条目级错引(rl_augmented_retrieval「7-8B 超过
   GPT-4o-mini」错引 search_r1 局限性块,实际出处 r1_searcher),已修复。

2. 检索凭证链(check-provenance):read-block/read-section/blocks/
   extract-claims --with-evidence 自动登记「取回过哪个块的哪个内容版本」
   (.cache 派生层);每条新引用必须有匹配当前内容 hash 的取回凭证——
   没真读过原文(或读的是旧版)造不出凭证,quote-first 从行为规范升级为
   机器可校验的溯源链。进 ingest 提交前闸门。e2e 实测三路(无凭证报缺/
   取回通过/版本漂移精准失效单条)。

3. 审计统计保证(audit-confidence):已审引用未通过率的 Clopper-Pearson
   精确置信上界(纯数学零依赖),验收抽样口径;诚实边界随结果携带
   (样本代表性 + 验证器查全率由评测集度量)。

4. 对抗评测集(evals/cite-check):20 case(8 毒化 + 12 干净)给防线立尺,
   确定性层期望由 pytest 钉死为回归闸门;--semantic 度量 DeepSeek 双通道。
   基线:确定性层毒化查全 8/8、误报 0/12;语义层查全 6/6、误报 0/8。
   评测集首跑即修出 3 个真实缺陷:16GB↔16TB 单位不敏感假阴(lint 与
   cloze 判分均改单位敏感匹配)、[需要来源] 窗口豁免未同步到 cloze 构建、
   反驳 prompt 对 ^h- 节级引用导航措辞过苛。

skills(镜像同步)+ CLAUDE.md/AGENTS.md 登记;测试 244 全绿;demo 守护通过。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 修 kb-export 模板违反 status 约定(LLM 预填 reviewed → draft + 注释)
- 修 kb-lint 的 i18n TS 类型表述与 CLAUDE.md 矛盾(TS 不强约束 en 侧)
- 新增 docs/citation-integrity.md(七层防线用户文档)并挂进双语 README;
  README/hook 处补 Windows(Git Bash/WSL)注记
- k.py:wiki 扫描类 lint 共享块切分缓存(health 全家族同页只切一次);
  新增 compact-ledgers(台账/检索凭证流水压缩,防无界增长)
- kb-lint 5b 补 agent_summary 蒸馏忠实度抽查条款(镜像同步)
- demo 守护语义修正:raw 不分发的库才是 demo(raw 在场的工作库由
  周检 + pre-commit staged 范围治理,不被全量断言卡死)
- smb-ecommerce 两条 header 元描述数字改写(存量裸论断归零)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- /health/citations:列出全部「引用审计未通过」CAUTION 标注(页面链接/行号/
  callout 原文/被引锚点),两键人工裁决——「误报,维持引用」把标注改写为一行
  NOTE 留痕(删除即标记)、「已修复,移除标注」删除标注;决议置
  last_modified_by: Human 并原子提交,页面无剩余标注时自动摘除
  citation-suspect 标签
- web/lib/citation-rewrite.ts 纯函数 + 12 个 node:test 用例(照 conflict-rewrite
  模式;起始行校验防串行;与 k.py SUSPECT_START_RE 同口径)
- operations.ts applyCitationVerdict:沿用 applyResolve 权限/写回/commit 链路;
  处理 k.py(strip 后正文)与 gray-matter(保留前导空行)的行号偏移差
- /api/citations:GET 透传 list-suspect-citations,POST 带 CSRF 校验
- HealthDashboard 新增「引用审计」复合卡(mismatch 闸门/待裁决/观察/未审计),
  suspects>0 时链接裁决页
- i18n zh/en 双侧各 16 个新 key;tsc、web 测试(49 pass)、i18n 同步测试全绿

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
在 dev 仓大规模清偿存量错引(rag-evolution 82 / smb-ecommerce 42 / ip 45 条
mismatch)过程中,逐条核实原文后确认部分"错引"实为工具自身的确定性核对
逻辑缺陷,而非内容错误。修复后 rag-evolution 与 smb-ecommerce 全部收敛到 0,
ip 库 18→5(剩余 5 条为已诊断清楚、低收益高风险的源格式歧义,未强行修复)。

1. arXiv HTML→markdown 转换的数学模式数字重复瑕疵:
   - 归一化新增 zero-width 字符剥离、LaTeX 细空格命令剥离
     (\,\;\:\!\quad\qquad)、\mathbf{}/\mathrm{}/\text{} 等 wrapper 展开
   - 小数 repeat("78.4278.4278.42"→"78.42"):group1 改惰性量词——贪婪量词
     对四连重复会在"合法但非最小"的中间长度(如"300300"×2 而非"300"×4)
     处满足回溯就停手,只对半折叠;惰性量词从最短开始试保证找到最小原子
     重复单元
   - 纯整数 repeat("101010k"→候选值含 10k):改用**候选值枚举**而非文本
     改写——"666666B" 无法从字符串本身判断原子单元是"6"x6/"66"x3/"666"x2
     (真实值),任何单一猜测都可能出错;枚举全部能整除的候选长度对应值,
     取并集加入 target_values(符合既定"目标侧宁可多算不可漏算"方向)
   - 行尾边界防护修正:原 (?![\d.]) 会把"跟着句号收尾"和"跟着小数点延续
     成更长小数"两种语义相反的情况混为一谈,导致大量以句号收尾的重复
     瑕疵拒绝折叠;改为 (?![\d]|\.\d) 精确区分
   - 量级后缀新增识别英文拼写词(million/billion/thousand),大小写不
     敏感但不影响既有单字符缩写(M/K 等)的大小写敏感语义
   - 测试:TestArxivConversionArtifactNormalization(6 个真实瑕疵案例 +
     5 个防误伤边界用例)、TestEnglishMagnitudeWords(3 个)

2. wiki list 块非末位条目锚点尾巴泄漏:原子分解(按条目拆分核对单元)
   依赖 ANCHOR_TAIL_RE 只在整块末尾剥离一次锚点;但部分 wiki 页每个条目
   自带独立行内锚点(非"整块仅末尾一个锚点"的标准形态),非末位条目的
   锚点尾巴不会被剥离,其哈希数字被误当成论断数字提取。_block_units 内
   增加 MULTILINE 变体逐行剥离作为拆分前兜底。测试:
   TestMidBlockAnchorTailLeak(2 个用例)。

263 测试全绿;evals/cite-check 对抗评测集回归无变化(确定性层 20/20,
毒化查全 8/8,干净误报 0/12);release 三个 demo 库闸门项保持 0(无回归)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
问题:wiki 是蒸馏层,长文档(③档 >150K)ingest 后 90%+ 细节只在 raw,而
`search` 只覆盖 wiki——未蒸馏的细节没有任何检索面,partial re-ingest 的触发
也只能靠章节标题命中。修法不是把摘要写长(注定有损且膨胀 wiki),而是给
细节层补检索面。

k.py search-raw(宽召回机械原语,零 LLM 零 embedding——语义智能由查询 agent
提供:检索前关键词扩展 / 搜空时 outline 结构化导航 / 检索后逐块精读裁决,
协议见 kb-query 第 4.7 步):
- 块级检索 raw(可选 --include-wiki),命中返回可 read-block 的块锚点 +
  所属章节 + agent_summary + deepen_hint
- 评分:正文子串计数(每词封顶 5)×1 / 所属章节标题 ×3 / agent_summary ×2 /
  整短语(双侧压空白)+5 / 多词全覆盖 +2;正文至少命中一词才返回(防纯标题
  命中整节刷屏);计数前掩码链接(防 arXiv TOC 目录块靠链接文本刷分)
- deepen_hint:命中块祖先章节在 source_summary「章节深度登记」表为 ⊙ 扫读 →
  提示触发 partial re-ingest(懒深化从"标题命中"升级为"内容级触发",被问过
  的细节自动沉淀)。登记表绑定优先 frontmatter sources(正文首链接顺序脆弱,
  仅作回退);按状态单元格判定 ⊙(升级后 ✓ 行备注含"由 ⊙ 升级"不得重新注册);
  registry key 用完整相对路径(stem 会让跨目录同名文件串档);归档/deprecated
  页跳过
- 实测 dev 9MB/98 文件语料:冷查询 0.13s,常见词最坏 0.44s;v0.3 FTS 触发时
  一并纳入索引(CLAUDE.md 演进节已登记)

对抗审查(双镜头 + 逐条对抗复核,14 agent)确认 11 条 findings 全部修复:
stem 串档(实测复现)、⊙ 整行扫描假阳、无锚命中提示不可执行 + 行号未加
frontmatter 偏移、绑定顺序脆弱、短语加成空白失效、模板示例与硬规范矛盾、
raw 不在场分支缺失(release demo 上会误导)、demo 登记表不合规、第 0 步
声明遗漏 4.7、outline 导航路径无 deepen 收尾、性能记录进 v0.3。

skills:kb-query 新增第 4.7 步「细节发现」(含 raw 不在场诚实降级、放弃
判据);kb-ingest 登记表硬规范(首列真实 anchor / 原标题不意译 / ⊙ 行备注
点名关键实体)+ 模板示例对齐。demo:kag/search_o1 登记表按新规范重写
(补全 9/5 个章节 + anchor + 关键词备注)。

测试 +19(基础/评分/deepen 联动/审查回归钉子);282 全绿;评测集无回归。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
问题:wiki 是蒸馏层,长文档 ingest 后 90%+ 细节只在 raw,而 `search`
只覆盖 wiki——未蒸馏的细节没有检索面。但无 embedding 架构下语义召回的
正解是「LLM 阅读结构化索引做判断」(可解释、零索引维护、零契约风险),
之前缺的是 raw 层没有库级目录视图——想浏览 98 篇文档得跑 98 次 outline,
没人会做,检索被迫全部退化到关键词路。

k.py corpus-map:一次调用输出全库地图,每篇紧凑条目:标题 / 字符数 / 档位
①②③ / 顶层章节树(标题 + agent_summary 或 preview 兜底)/ 深度登记状态
(✓⊙× 来自 source_summary「章节深度登记」表)/ 关联 source_summary
(「未 ingest」= 蒸馏盲区,立刻在地图可见)/ 章节摘要覆盖率。纯读现成
.outline.json + 解析 source_summary 登记表,零 LLM 零 embedding。

登记解析重构:_load_skim_registry(search-raw deepen_hint 用)改为全量
_load_depth_registry 的 ⊙ 视图,绑定逻辑提取为 _source_page_raw_key
(frontmatter sources 优先 > 正文首链接回退);状态判定改用「第一个以
✓/⊙/× 开头单元格的首字符」——升级行「✓ 深读 | 备注: 由 ⊙ 升级」正确
判为 ✓,不再因备注含 ⊙ 误注册为扫读。

kb-query 4.7 重写为双路由协议:
- **关键词路**(有明确术语/数字):多组措辞 search-raw + 精读裁决
- **浏览路**(概念性/改述性):corpus-map(~12K token 一跳换全库视野)
  → outline → read-section,每跳由 agent 做语义判断
两路共享收尾:懒回填摘要(读都读了零边际成本,密度随使用增长,与懒
深化同构)/ deepen 触发(看 corpus-map 的 [⊙] 标注即知)/ 作答必须
引用原文块锚点(地图/摘要/标题只是路标,禁当内容作答)/ check-draft 闸门。
含 raw 不在场诚实降级、放弃判据的硬条款。

实测 dev 9MB/98 篇语料:corpus-map 0.09s / 47KB 输出,0/3661 的摘要密度
暴露了懒回填空间;smb-ecommerce 8 篇「未 ingest」文档立刻可见。

测试 +12(基础/链接/边界覆盖空文档/150K 严格大于/无 H1/多 H1)。295 全绿
(session 限额耗尽,原计划 12-agent 对抗审查 workflow 未能启动——改由
review-search-raw 同款视角自检:档位边界实测、空 raw 降级、多源映射、
标题兜底、fmt 数字格式、行号/路径安全面均经查证无问题;4.7 双路由与
search-raw 共存逻辑与检查清单/反例自洽)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
review-corpus-map-v2 审查修复的收尾——三处半成品:

1. title_counts 从未填充(核心 bug):_row_status 的 title-only
   「文档内同名唯一」闸门依赖它,但 dict 只声明未计数 → 任何
   title-only 登记行恒判 None,按标题匹配深度状态的功能是死的。
   补前置 _count_titles pre-pass,在 _walk 前填满全文档标题计数。
2. 删重复行 depth = max(1, int(depth))。
3. _broken 死代码:except 只 continue 从不 append → 打印永不触发。
   改为记录失败文件并报到 stderr(__import__("sys") → sys)。

test_k_corpus_map.py::test_depth_status_by_anchor_and_title 由 fail 转 pass;
全量 301 passed。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
用户决定今后只维护 release 单仓、逐渐作废 dev(AI知识库/)仓。双仓同步
约定整节退役:删除 CLAUDE.md / AGENTS.md 的「双仓库同步约定」节(镜像逐字
同步删除),设计文档目录图根名 AI知识库/ → groundmap/ 对齐 CLAUDE.md。

单仓内仍有效的不变量(CLAUDE↔AGENTS 镜像、.claude/skills↔.agents/skills、
RELATION_TYPES/WIKILINK_RE drift-sync)在文件顶部与「演进与兼容性」节已有
记录,由 TestMirrorSync / TestRelationTypesSync / TestWikilinkRegexSync
守护,无孤儿引用。test_release_guards.py 19 passed。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
固化 co-located KB 约定:引擎(本项目)保持纯代码,私人知识库数据存在
引擎外的独立文件夹(= KB_ROOT,含 workspaces/<name>/),源文档 raw/ 与
构建结果 wiki/ 同处一个自包含文件夹。含一次性初始化、日常命令、Claude
Code 极简摄入流程、独立 git 版本控制建议。

复用现有 KB_ROOT + new-workspace 机制,无新代码。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
projectRoot() 把「引擎根」和「数据根」混为一谈——设 KB_ROOT 指向外置
数据目录时,k-cli.ts 用它拼 scripts/k.py 会找到数据根去(KB_ROOT/scripts/k.py
不存在),导致所有 k.py 调用报「can't open scripts/k.py」、health/graph 等
全部 500。CLAUDE.md 宣称支持 `KB_ROOT=... npm run dev` 但实际不通。

拆分 kb.ts:engineRoot()(恒为 web 父目录,装 scripts/k.py,不受 KB_ROOT
影响)vs projectRoot()(数据根 = KB_ROOT ?? engineRoot())。k-cli.ts 改用
engineRoot() 解析脚本路径与 cwd;KB_ROOT 仍通过 spawn env 透传给 k.py 子
进程,由 k.py 自己解析数据根(与 k.py/convert.py 语义一致)。

验证:KB_ROOT=<外置库> npm run dev,health API 返回 total_pages=40、
graph 40 节点/236 边(此前全 500)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
当一份原文来源内容变了(数字改/段落重写/章节增删),保证引用它的 wiki
不悄悄过期。设计经三视角对抗审查(correctness/completeness/safety)+
引擎行为实测(临时库跑通 + 0.IP 真实库基线自检)修正,核心:

- raw 只读硬护栏:agent 绝不 Edit/Write raw(settings.json 硬 deny);
  内容只在外部真相源原件(如 Obsidian .md)上改,cp 镜像进 raw,
  convert.py 是唯一 raw 写入者(加锚)。
- 干净原件覆盖 → convert --workspace(免 --force):只重锚被改文件,
  未改块锚点逐字节复现(实测证实 determinism)。
- broken-ref 三诊断:旧锚 read-block →命中且一致=纯 seq 位移(机械改 seq)/
  命中已变=MODIFY(按原文改论断+回验)/回收失败=DELETE(改引/[需要来源]+
  #to-be-updated)。覆盖 MODIFY/ADD/DELETE 三类 + 扇出 + ③档登记表重对齐。
- git 用 git -C "$KB_ROOT" 打数据仓;闸门用 --paths 显式驱动 + 断言
  pairs>0(躲 --changed 在未跟踪下静默 0 对假绿);raw 入库按 check-ignore。

.claude/skills 与 .agents/skills 字节镜像;CLAUDE.md/AGENTS.md 入口表登记。
TestMirrorSync + 全量 301 测试通过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
开源仓不得含私人绝对路径(CLAUDE.md 项目定位)。真相源原件目录改用
$SRC_ROOT 变量占位 + 说明,示例不再泄露具体 vault 路径。两份镜像同步。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
现代 macOS / 多数发行版只装 python3、不带 python(py2 早已移除),k.py/
convert.py 均为 Python 3 脚本。旧默认 "python" 在精简 PATH(如 Finder/
launchd 启动的进程)下 ENOENT,导致所有 k.py 调用失败、health/graph 500。
改默认 python3;仍可用 KB_PY 覆盖(如指向带依赖的特定解释器)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant